package com.baizhi.shane.shane.service;

import com.baizhi.shane.shane.dto.GetOneQuestionOutDTO;
import com.baizhi.shane.shane.dto.UserManagerOutDTO;
import com.baizhi.shane.shane.entity.ShaneQuestion;
import com.baizhi.shane.shane.vo.*;
import com.baizhi.shane.sys.vo.IdVO;
import com.baizhi.shane.sys.vo.SuccessedOutVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
* @author wbz12
* @description 针对表【shane_question(啥呢问题表)】的数据库操作Service
* @createDate 2023-07-25 22:33:37
*/
public interface ShaneQuestionService extends IService<ShaneQuestion> {

    /**
     * 新增一个问题
     *
     * @Author 闻柏智
     * @Date 16:56 2024/3/1
     * @Param questionInsertInVO
     * @return com.baizhi.shane.sys.vo.SuccessedOutVO
     **/
    SuccessedOutVO insertOne(QuestionInsertInVO questionInsertInVO);

    /**
     * 通过关键字模糊查询问题列表
     *
     * @Author 闻柏智
     * @Date 15:44 2024/1/22
     * @Param pageInVO
     * @return java.util.List<com.baizhi.shane.shane.vo.PageQuestionOutVO>
     **/
    List<PageQuestionOutVO> pageByContent(PageInVO pageInVO);

    /**
     * 测试初始化的时候用的
     *
     * @Author 闻柏智
     * @Date 16:28 2024/3/2
     * @Param
     * @return void
     **/
    void testInitAssociationTable();

    /**
     * 从List随机取出n个数
     *
     * @Author 闻柏智
     * @Date 19:45 2023/9/29
     * @Param list
     * @return java.util.List<java.lang.Long>
     **/
    List<Long> getRandomFromList(List<Long> list, int n);

    SuccessedOutVO deleteOneQuestionById(IdVO idVO);

    /**
     * 通过关键字查询问题列表的元素数量和分页个数
     *
     * @Author 闻柏智
     * @Date 20:11 2024/1/1
     * @Param pageInVO
     * @return com.baizhi.shane.shane.vo.CountAndPageOutVO
     **/
    CountAndPageOutVO countAndPageByContent(PageInVO pageInVO);

    /**
     * 通过问题ID列表查询这些问题的标签列表
     *
     * @Author 闻柏智
     * @Date 17:22 2024/1/7
     * @Param idListStr
     * @return java.util.List<com.baizhi.shane.shane.vo.QuestionLabelOutVO>
     **/
    List<QuestionLabelOutVO> getQuestionLabelListByQuestionIdList(String idListStr);

    /**
     * 通过问题ID查询单个问题的标签
     *
     * @Author 闻柏智
     * @Date 17:28 2024/1/7
     * @Param questionId
     * @return com.baizhi.shane.shane.vo.QuestionLabelOutVO
     **/
    QuestionLabelOutVO getQuestionLabelByQuestionId(Long questionId);

    /**
     * 通过问题ID列表查询这些问题的点赞数量
     *
     * @Author 闻柏智
     * @Date 22:53 2024/1/17
     * @Param questionIdList
     * @return java.util.List<com.baizhi.shane.shane.vo.CountVO>
     **/
    List<CountVO> getQuestionLikeCountByQuestionIdList(List<Long> questionIdList);

    /**
     * 通过问题ID列表查询这些问题的点赞数量,并且转成Map
     *
     * @Author 闻柏智
     * @Date 21:51 2024/1/20
     * @Param questionIdList
     * @return java.util.Map<java.lang.Long,java.util.List<com.baizhi.shane.shane.vo.CountVO>>
     **/
    Map<Long, CountVO> getQuestionLikeCountMapByQuestionIdList(List<Long> questionIdList);

    /**
     * 通过问题ID查询单个问题的点赞数量
     *
     * @Author 闻柏智
     * @Date 23:10 2024/1/17
     * @Param questionId
     * @return com.baizhi.shane.shane.vo.CountVO
     **/
    CountVO getOneQuestionLikeCountByQuestionId(Long questionId);

    /**
     * 通过问题ID列表查询这些问题的收藏数量
     *
     * @Author 闻柏智
     * @Date 13:21 2024/1/18
     * @Param questionIdList
     * @return java.util.List<com.baizhi.shane.shane.vo.CountVO>
     **/
    List<CountVO> getQuestionCollectCountByQuestionIdList(List<Long> questionIdList);

    /**
     * 通过问题ID列表查询这些问题的收藏数量,并且转成Map
     *
     * @Author 闻柏智
     * @Date 22:01 2024/1/20
     * @Param questionIdList
     * @return java.util.Map<java.lang.Long,com.baizhi.shane.shane.vo.CountVO>
     **/
    Map<Long, CountVO> getQuestionCollectCountMapByQuestionIdList(List<Long> questionIdList);

    /**
     * 通过问题ID查询单个问题的收藏数量
     *
     * @Author 闻柏智
     * @Date 13:25 2024/1/18
     * @Param questionId
     * @return com.baizhi.shane.shane.vo.CountVO
     **/
    CountVO getOneQuestionCollectCountByQuestionId(Long questionId);

    /**
     * 通过问题ID列表查询这些问题的评论数量
     *
     * @Author 闻柏智
     * @Date 13:30 2024/1/18
     * @Param questionIdList
     * @return java.util.List<com.baizhi.shane.shane.vo.CountVO>
     **/
    List<CountVO> getQuestionCommentCountByQuestionIdList(List<Long> questionIdList);

    /**
     * 通过问题ID列表查询这些问题的评论数量，并且转为Map
     *
     * @Author 闻柏智
     * @Date 22:06 2024/1/20
     * @Param questionIdList
     * @return java.util.Map<java.lang.Long,com.baizhi.shane.shane.vo.CountVO>
     **/
    Map<Long, CountVO> getQuestionCommentCountMapByQuestionIdList(List<Long> questionIdList);


    /**
     * 通过问题ID查询单个问题的评论数量
     *
     * @Author 闻柏智
     * @Date 13:39 2024/1/18
     * @Param questionId
     * @return com.baizhi.shane.shane.vo.CountVO
     **/
    CountVO getOneQuestionCommentCountByQuestionId(Long questionId);

    /**
     * 通过ID查询单个问题信息
     *
     * @Author 闻柏智
     * @Date 16:07 2024/2/29
     * @Param questionId
     * @return com.baizhi.shane.shane.vo.GetOneQuestionOutVO
     **/
    GetOneQuestionOutVO getOneQuestionById(Long questionId);

    /**
     * 我发布过的问题
     *
     * @Author 闻柏智
     * @Date 21:15 2024/3/3
     * @Param
     * @return java.util.List<com.baizhi.shane.shane.entity.ShaneQuestion>
     **/
    List<ShaneQuestion> myPosted();

    /**
     * 通过ID编辑问题
     *
     * @Author 闻柏智
     * @Date 22:34 2024/3/3
     * @Param shaneQuestion
     * @return com.baizhi.shane.sys.vo.SuccessedOutVO
     **/
    SuccessedOutVO updateOneById(ShaneQuestion shaneQuestion);

    /**
     * 我收藏的问题
     *
     * @Author 闻柏智
     * @Date 14:28 2024/3/4
     * @Param
     * @return java.util.List<com.baizhi.shane.shane.entity.ShaneQuestion>
     **/
    List<ShaneQuestion> myCollected();

    /**
     * 用户管理信息列表查询
     *
     * @Author 闻柏智
     * @Date 17:38 2024/3/4
     * @Param pageInVO
     * @return java.util.List<com.baizhi.shane.shane.dto.UserManagerOutDTO>
     **/
    List<UserManagerOutDTO> userManagerList(PageInVO pageInVO);

    /**
     * 用户管理信息列表数量查询
     *
     * @Author 闻柏智
     * @Date 17:38 2024/3/4
     * @Param pageInVO
     * @return com.baizhi.shane.shane.vo.CountAndPageOutVO
     **/
    CountAndPageOutVO userManagerCountAndPageByContent(PageInVO pageInVO);

}
